package com.example.recipes;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.zookeeper.CreateMode;

/**
 * Zookeeper原生支持通过注册 Watcher来进行事件监听,但是其使用并不是特别方便, 需要开发人员自己反复注册 Watcher,比较繁琐。
 * Curator引入了 Cache来实现对Zookeeper服务端事件的监听。
 * Cache是 Curator中对事件监听的包装,其对事件的监听其实可以近似看作是一个本地缓存视图和远程Z00 Keeper视图的对比过程。
 * 同时 Curator 能够自动为开发人员处理反复注册监听,从而大大简化了原生API开发的繁琐过程。
 * Cache分为两类监听类型:节点监听和子节点监听。
 *
 * @author Creared by wangyang on 2019-01-29 10:12
 * email:techyang.wangy.@ymm56.com
 */
public class NodeCacheSample {
    private static final String PATH = "/zk-book/nodecache";

    private static CuratorFramework client = CuratorFrameworkHolder.CURATOR_FRAMEWORK;

    public static void main(String[] args) throws Exception {
        client.start();
        client.create()
                .creatingParentsIfNeeded()
                .withMode(CreateMode.EPHEMERAL)
                .forPath(PATH, "nodecache".getBytes());

        NodeCache nodeCache = new NodeCache(client, PATH, Boolean.FALSE);
        nodeCache.start();
        nodeCache.getListenable().addListener(() -> {
            System.out.println("Node data updated, new data: " + new String(nodeCache.getCurrentData().getData()));
        });
        client.setData().forPath(PATH, "newNodeCache".getBytes());
        Thread.sleep(1000);
        client.delete().deletingChildrenIfNeeded().forPath(PATH);
        Thread.sleep(Integer.MAX_VALUE);
    }
}
